package com.charon.module.sys.web;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import com.charon.common.result.Result;
import com.charon.common.util.StringUtils;
import com.charon.common.util.UserUtils;
import com.charon.module.sys.entity.UserEntity;
import com.charon.module.sys.service.LoginService;

/**
 * @ClassName：LoginController.java
 * @Description: 登录
 * @Author charon [248135724@qq.com]
 * @Date:   2018年11月30日 上午2:57:22 
 * @version V1.0 
 */
@RequestMapping("/login")
@Controller
public class LoginController {

	@Autowired
	private LoginService ls;
	
	public Result<String> addUser(UserEntity ue){
		Result<String> r=new Result<String>();
		r.setStatus("200");
		if(!StringUtils.isEmpty(ue.getAccount())){
			r.setMessage("账户不能为空");
			return r;
		}
		if(!StringUtils.isEmpty(ue.getPassword())){
			r.setMessage("密码不能为空");
			return r;
		}
		return null;
	}
	
	
	@RequestMapping("login")
	public String login(){
		return "/sys/login";
	}
	
	@RequestMapping("403")
	public String get403(){
		return "/sys/403";
	}
	/**
	 * @Description: 登录   
	 * @author:charon [248135724@qq.com]
	 * @date:  2018年12月3日 下午10:30:19 
	 * @param: user
	 * @param: remember 记住登录状态
	 * @return: String
	 */
	@RequestMapping(value="subLogin",produces="application/json;charset=utf-8")
	public String login(UserEntity user,boolean remember){
		System.out.println(user.toString());
		System.out.println(remember);
		Subject subject = SecurityUtils.getSubject();
		UsernamePasswordToken token=new UsernamePasswordToken(user.getAccount(),user.getPassword());
		try{
			//设置自动存储Cookie
			token.setRememberMe(remember);
			subject.login(token);
		}catch(AuthenticationException e){
			System.out.println("账户或密码错误："+e.getMessage());
			return "/WEB-INF/view/sys/403";
		}
		if(subject.hasRole("0")){
			return "/WEB-INF/view/music/index";
		}
		return "登录成功";
	}
	
	/**
	 * @Description: 如果将这里设置成OR，表示所列出的条件只要满足其中一个就可以，
	 * 		如果不写或者设置成logical = Logical.AND，表示所有列出的都必须满足才能进入方法。
	 * @author:charon [248135724@qq.com]
	 * @date:   2018年12月19日 上午1:24:31 
	 * @param:
	 * @return: String
	 */
	@RequiresPermissions(value={"1","2","3"},logical = Logical.AND)
	@RequiresRoles(value={"0"},logical = Logical.OR)
	@RequestMapping(value="/testRole",method=RequestMethod.GET )
	@ResponseBody
	public String testRole(){
		System.out.println(ls.findList(null, 1, 10));
		System.out.println(UserUtils.getUser());
		return "testRole success";
	}
	
	@RequiresRoles("3")
	@RequestMapping(value="/testRole1",method=RequestMethod.GET )
	@ResponseBody
	public String testRole1(){
		return "testRole success";
	}
	
	@RequestMapping(value="/testRole2",method=RequestMethod.GET )
	@ResponseBody
	public String testRole2(){
		return "测试只需要登陆，不需要权限，主要测试是否是Cookie中存储的token导致的重复登录问题。"
				+ "测试该功能需要将cookie打开";
	}
	
	
	/**
	 * @Description:注册功能    
	 * @author:charon [248135724@qq.com]
	 * @date:   2018年12月3日 下午10:31:16 
	 * @param: 
	 * @return: String
	 */
	@RequestMapping("register")
	public String register(UserEntity user){
		//if(null!=ls.verifyExist(user))ls.insertUser(user);
		return "账户已存在";
	}
	
	@RequestMapping(value="logout")
	public String logout(){
		Subject subject = new Subject.Builder().buildSubject();
		//这里之前logout退出不管用，在shiro.xml配置中加了/login/logout = logout之后可以使用了
		subject.logout();
		return "/sys/login";
	}
	
	
	/**
	 * @Description: 验证账户是否存在
	 * @Author charon [248135724@qq.com]
	 * @Date:   2019年1月11日 下午4:42:34 
	 * @param： account
	 * @return：Result<Object>
	 */
	public Result<String> verifyExist(String account){
		Result<String> r=new Result<String>();
		UserEntity verifyExist = ls.findUserByAccount(account);
		if(verifyExist==null){
			r.setData("用户已存在！");
			r.setMessage("用户已存在！");
			r.setStatus("200");
			return r;
		}else{
			r.setData("账号可以使用");
			r.setMessage("账号可以使用");
			r.setStatus("200");
			return r;
		}
		
	}
	
	/**
	 * @Description: 验证手机号是否已经注册 
	 * @Author charon [248135724@qq.com]
	 * @Date:   2019年1月11日 下午4:35:19 
	 * @param： phone 手机号码
	 * @return：Result<Object> 验证结果
	 */
	public Result<String> verifyPhone(Integer phone){
		Result<String> r=new Result<String>();
		UserEntity verifyExist = ls.findUserByPhone(phone);
		if(verifyExist==null){
			r.setData("该手机号码已存在，请更换或解除绑该手机号码后重新尝试！");
			r.setMessage("该手机号码已存在，请更换或解除绑该手机号码后重新尝试！");
			r.setStatus("200");
			return r;
		}else{
			r.setData("手机号码可以使用");
			r.setMessage("手机号码可以使用");
			r.setStatus("200");
			return r;
		}
	}
	
	/**
	 * @Description: 验证邮箱是否存在
	 * @Author charon [248135724@qq.com]
	 * @Date:   2019年1月11日 下午4:38:10 
	 * @param： email 邮箱
	 * @return：Result<Object>
	 */
	public Result<String> verifyEmail(String email){
		Result<String> r=new Result<String>();
		UserEntity verifyExist = ls.findUserByEmail(email);
		if(verifyExist==null){
			r.setData("该邮箱已存在，请更换或解除绑该邮箱后重新尝试！");
			r.setMessage("该邮箱已存在，请更换或解除绑该邮箱后重新尝试！");
			r.setStatus("200");
			return r;
		}else{
			r.setData("手机号码可以使用");
			r.setMessage("手机号码可以使用");
			r.setStatus("200");
			return r;
		}
	}
}
